package tutoria.lobao.poo.maquinarefrigerante;

import java.util.Scanner;

public class MainMachine {
	public static void main(String[] args) {
		MaquinaRefrigerante machine = new MaquinaRefrigerante();
		Scanner sc = new Scanner(System.in);

		// TODO: criar uma interface de utilização da máquina
		//
		// exemplo: Depois que a máquina for "ligada na tomada" (quando o objeto
		// for criado),
		// a máquina deve funcionar ininterruptamente ou enquanto até acabar o
		// estoque (de dinheiro ou de produto)

		//
		// Processo de funcionamento ** A FAZER **
		//
		// Inserir o dinheiro
		// Escolher o refrigerante
		// Receber o troco (se houver)
		// Receber o refrigerante *
		//
		// * Caso não haja mais refrigerantes disponíveis, ou o dinheiro for
		// insuficiente, aparece a mensagem do erro

		// INCOMPLETO: fazer UI

		System.out.println("");
		System.out.println("========================================");
		System.out.println("Programa: MaquinaRefrigerante");
		System.out.println("*");
		System.out.println("** Digite -1 para desligar a maquina **");
		System.out.println("*");
		System.out.println("========================================");
		System.out.println("");

		// Executa o laço a partir daqui
		int controle_do_programa = 0, refrigerante_escolhido, opcao_moeda = 0, contador_execucoes = 0;
		double dinheiro_fornecido;
		double[] moedas;

		while (controle_do_programa != -1) {
			// Log de execuções
			System.out.println("\nExecucao numero #" + ++contador_execucoes);
			System.out.println("");

			dinheiro_fornecido = 0; // reseta em cada execução

			// Lê os dados
			System.out.println("* Opcoes de moedas");

			moedas = machine.getCoins();
			// Exibe a lista de moedas disponíveis para uso
			for (int i = 0; i < moedas.length; i++) {
				System.out.println(i + ": R$ " + moedas[i]);
			}

			do {
				// Fazer validações com -> key instanceof Integer <-
				System.out.print("\nInsira uma moeda (digite -2 para terminar): ");
				do {
					opcao_moeda = sc.nextInt();

					if (opcao_moeda < -2 || opcao_moeda > moedas.length - 1) {
						System.out.print("\nInsira uma moeda valida: ");
					}
				} while (opcao_moeda < -2 || opcao_moeda > moedas.length - 1); // Validação
																				// de
																				// entrada
				if (opcao_moeda == -2 || opcao_moeda == -1)
					break; // Encerra a execução do programa e sai do laço

				// Acumula o valor das moedas, se forem válidas
				if (controle_do_programa != -2) {
					dinheiro_fornecido += moedas[opcao_moeda];
				}
			} while (opcao_moeda != -2 || opcao_moeda != -1);
			if (opcao_moeda == -1)
				break; // Encerra a execução do programa e sai do laço principal

			// Registra o dinheiro fornecido pelo usuário
			machine.setMoney(dinheiro_fornecido);

			// Exibe opções de refrigerante
			System.out.println("");
			// machine.showOptions();
			System.out.print(machine.getOpcoesRefrigerantes());
			System.out.println("");

			// Lê os dados
			System.out.print("Escolha o refrigerante: ");
			refrigerante_escolhido = 0;
			// Valida se o usuario escolheu uma opção existente
			do {
				refrigerante_escolhido = sc.nextInt();
				// Validação
				if (refrigerante_escolhido < -1
						|| refrigerante_escolhido > machine.getQuantidadeDeOpcoes() - 1) {
					System.out.print("\nEscolha um refrigerante valido: ");
				}
			} while (refrigerante_escolhido < -1
					|| refrigerante_escolhido > machine.getQuantidadeDeOpcoes() - 1);

			if (refrigerante_escolhido == -1)
				break; // Encerra a execução do programa e sai do laço principal

			// Registra a opção do refrigerante
			machine.setOptionSoda(refrigerante_escolhido);

			// Faz a validação dos dados fornecidos
			// TO_KNOW: Deveria estar dentro dos metodos exibeTroco() e
			// entregarRefrigerante() ?
			machine.processaDados();

			// se estiver tudo válido, retorna o troco
			// senão, retorna o mesmo dinheiro fornecido
			System.out.println("");
			System.out.println("Valor do refrigerante (R$): " + machine.getValorRefrigerante());
			System.out.println("Dinheiro Fornecido (R$): " + machine.getMoney());
			System.out.println("Troco (R$): " + machine.getTroco());
			System.out
					.println("Produtos restantes no estoque: " + machine.getQuantidadeEmEstoque());

			// Se estiver tudo válido, retorna o nome do refrigerante
			// senão, retorna mensagem do erro.
			// TO_KNOW: usar entregarRefrigerante() ou chamar um método de
			// retorno genérico?
			System.out.println(machine.entregarRefrigerante());
			System.out.println("------------------------------------");
		}
	}
}